home *** CD-ROM | disk | FTP | other *** search
/ C!T ROM 3 / ct-rom iiib.zip / ct-rom iiib / WINDOWS / UTILITY / DESKTOP / W_ONE49 / TOUCH.CP_ / TOUCH.CP
Text File  |  1994-04-27  |  6KB  |  230 lines

  1. #include "touch.h"
  2.  
  3. /******************************************************************\
  4. *                                                                  *
  5. *           w       w                oooo                           *
  6. *           w       w  iii  n   n   o    o   n   n  eeee            *
  7. *           w       w   i   nn  n  o      o  nn  n  e               *
  8. *           w   w   w   i   n n n  o      o  n n n  eee             *
  9. *              w w w w    i   n  nn   o    o   n  nn  e               *
  10. *              w   w    iii  n   n    oooo    n   n  eeee            *
  11. *                                                                      *
  12. *     C o m m a n d   L a n g u a g e   I n t e r p r e t e r      *
  13. *                                                                      *
  14. *                                                                      *
  15. *    Written by Lucien Cinc                                         *
  16. *    Copyright (c) 1992, 1993                                       *
  17. *                                                                  *
  18. \******************************************************************/
  19.  
  20. DOS_FILE_DATE fdate;
  21. DOS_FILE_TIME ftime;
  22.  
  23. int count = 0;
  24.  
  25. void touch(char *p);
  26. int getuser(char *s, struct dosdate_t *date, struct dostime_t *time);
  27. void summary(void);
  28.  
  29. int main(void)
  30. {
  31.     int n, i;
  32.     struct dosdate_t date;
  33.     struct dostime_t time;
  34.     char *sp;
  35.  
  36.     sp = args();                // parse command line switches
  37.     while(*sp)
  38.         switch(*sp++) {
  39.             case 'v' :          // show version information
  40.                        printf("%cVersion %c%d.%01d\n", WHITE, YELLOW, VERSION / 10, VERSION % 10);
  41.                        return 0;
  42.             default:            // invalid switch
  43.                        perror("Invalid switch");
  44.                        return 1;
  45.         }
  46.  
  47.     if (argnstr() != 0) {           // no command line string's allowed
  48.         perror("Invalid argument");
  49.         return 1;
  50.     }
  51.  
  52.     _dos_getdate(&date);            // get system date and time
  53.     _dos_gettime(&time);
  54.  
  55.     switch(argc()) {               // parse command line arguments
  56.         case 1:
  57.                 break;
  58.         case 2:
  59.                 if (getuser(argv(2), &date, &time))
  60.                     return 1;        // invalid date or time
  61.                 break;
  62.         case 3:
  63.                 if (getuser(argv(2), &date, &time) ||
  64.                     getuser(argv(3), &date, &time))
  65.                         return 1;    // invalid date or time
  66.                 break;
  67.         default:
  68.                 perror("To many or few arguments");
  69.                 return 2;
  70.     }
  71.  
  72.     fdate.b.Day = date.day;                // date to set
  73.     fdate.b.Month = date.month;
  74.     fdate.b.Year = date.year - 1980;
  75.  
  76.     ftime.b.Hour = time.hour;            // time to set
  77.     ftime.b.Minute = time.minute;
  78.     ftime.b.Second = time.second;
  79.  
  80.     if ((n = fillfile(argpath(1), ATT_RHSA)) > 0) {        // some files to touch
  81.  
  82.         limit(n);    // status bar upper limit
  83.  
  84.         for (i = 0;i < n;i++, inc(1))
  85.             touch(getfilepath(i));        // file to be touched
  86.  
  87.         summary();
  88.  
  89.         empty();    // finished with status bar
  90.  
  91.     } else {                                            // a file to create and touch
  92.  
  93.         // no need to check for wildcards in argabs() because
  94.         // touch() will fail after trying to create the file
  95.  
  96.         touch(argabs(1));    
  97.         summary();
  98.  
  99.     }
  100.  
  101.     return 0;
  102. }
  103.  
  104. int stoi(char **str)
  105. {
  106.     char *tstr = (char *)*str;
  107.     int n = 0;
  108.  
  109.     while (isdigit(*tstr))
  110.           n = n * 10 + (*tstr++ - '0');
  111.  
  112.     *str = (char *)tstr;
  113.  
  114.     return n;
  115. }
  116.  
  117. int getdate(char *s, struct dosdate_t *date)
  118. {
  119.     int mon, day, year;
  120.     int days[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  121.     int okflag = FALSE;
  122.  
  123.     if (isdigit(*s)) {
  124.         day = stoi(&s);                    // parse day
  125.  
  126.         if (*s++ == '-' && isdigit(*s)) {
  127.             mon = stoi(&s);                // parse month
  128.  
  129.             if (*s++  == '-' && isdigit(*s)) {
  130.                 year = stoi(&s);        // parse year
  131.  
  132.                 if (year % 4 == 0 && year % 100 != 0 || year & 400 == 0)
  133.                     days[2] = 29;              // adjust for leap year
  134.  
  135.                 if (*s == '\0')
  136.                     okflag = TRUE;
  137.             }
  138.         }
  139.     }
  140.  
  141.     if (okflag &&
  142.        (mon > 0 && mon < 13) &&
  143.        (day > 0 && day <= days[mon]) &&
  144.        (year > 1979 && year < 2101)) {    // correctly parsed date
  145.  
  146.             date->day = day;
  147.             date->month = mon;
  148.             date->year = year;
  149.  
  150.     } else {
  151.         perror("Invalid date");
  152.         return 1;    // Invalid Date
  153.     }
  154.  
  155.     return 0;
  156. }
  157.  
  158. int gettime(char *s, struct dostime_t *time)
  159. {
  160.     int hour, min, sec = 0;
  161.     BOOL okflag = FALSE;
  162.     
  163.     if (isdigit(*s)) {
  164.         hour = stoi(&s);            // parse hour
  165.  
  166.         if (*s++ == ':' && isdigit(*s)) {
  167.               min = stoi(&s);            // parse minute
  168.  
  169.             if (*s == '\0')
  170.                 okflag = TRUE;        // done
  171.             else if (*s++ == ':' && isdigit(*s)) {
  172.                 sec = stoi (&s);     // parse optional seconds
  173.  
  174.                 if (*s == '\0')
  175.                     okflag = TRUE;    // done
  176.             }
  177.         }
  178.     }
  179.  
  180.     if (okflag &&
  181.        (hour >= 0 && hour < 24) &&
  182.        (min >= 0 && min < 60) &&
  183.        (sec >= 0 && sec < 60)) {    // correctly parsed time
  184.  
  185.             time->hour = hour;
  186.               time->minute = min;
  187.               time->second = sec;
  188.  
  189.     } else {
  190.         perror("Invalid time");
  191.         return 1;        // Invalid Time
  192.     }
  193.  
  194.     return 0;
  195. }
  196.  
  197. int getuser(char *s, struct dosdate_t *date, struct dostime_t *time)
  198. {
  199.     if (strchr(s, ':'))                // assume a time
  200.         return gettime(s, time);
  201.     else                            // assume a date
  202.         return getdate(s, date);
  203. }
  204.  
  205. void touch(char *p)
  206. {
  207.     int handle;
  208.  
  209.     // touch only works for files, since there is no function
  210.     // to set the date and time for a directory
  211.      
  212.     if (_dos_open(p, O_RDONLY, &handle) && _dos_creat(p, 0, &handle)) {
  213.         perror("Invalid path or file name");
  214.         return;
  215.     }
  216.  
  217.     _dos_setftime(handle, fdate.u, ftime.u);    // at last
  218.     _dos_close(handle);
  219.  
  220.     count++;                                    // increment counter
  221.  
  222.     printf("%c%s %c%s\n", GREEN, unixpath(padfilename(p)), LIGHTGRAY, getdesc(p));
  223. }
  224.  
  225. void summary(void)
  226. {
  227.     if (count)
  228.         printf("\n%c%5d %cfile(s) touched\n", YELLOW, count, WHITE);
  229. }
  230.